/**
 * ガントチャート描画オブジェクト
 */

if (typeof(App.ListWbsGrid) == "undefined") {


//var listWbsGrid = new listWbsGrid() ;
//YAHOO.util.Event.addListener(window, 'load', listWbsGrid.fncRender, listWbsGrid, true);

/**
 * constructor
 */
ListWbsGrid = function(initparam)
{
    // スーパークラスコンストラクタ呼び出し
    // App.ListGanttGrid.superclass.constructor.call(this);
    
    this.fncSetInitParameter(initparam);
    this.fncInitialize();
} ;

ListWbsGrid.prototype = {

    //=============================
    // メンバー
    //=============================
    initparam      : {},                // 初期化パラメータ
    dataparam      : {},                // データパラメータ
    container_grid : "list_wbs_grid",           // コンテナエレメントのID
    container_panel: "list_wbs_grid_panel",     // コンテナエレメントのID
    callback       : new Array(),               // コールバック定義
    elm_grid       : null,                      // グリッドエレメント
    dataStore      : null,                      // データストアオブジェクト
    selectedIndex  : -1,                        // 選択行インデックス
    ctxMenu        : null,                      // コンテキストメニュー

    /*
     * 関数名：fncSetInitParameter
     * 概　要：初期化パラメータをセットする
     * 引　数：なし
     * 戻り値：なし
     */
    fncSetInitParameter: function( initparam )
    {
        if( initparam != null){
            this.initparam = initparam;
        }
        
        // initparamの内容で、メンバー値を初期化
        var keys = '';
        for (key in this.initparam) {
            var test = this.initparam[key];
            keys += (key == '') ? '' : ',';
            keys += key;
        }
        if( keys != "" ){
            var keysarr = keys.split(',') ;
            for( i in keysarr ){
                this[keysarr[i]] = this.initparam[keysarr[i]] ;
            }
        }
    },
    
    /*
     * 関数名：fncInitialize
     * 概　要：ダイアログ初期化処理を行う（初期化時に呼び出される）
     * 引　数：なし
     * 戻り値：なし
     */
    fncInitialize: function()
    {
        // サブクラスにて必要な際に実装
    },

    fncRender : function()
    {
        //-----------------------------
        // データストア生成
        //-----------------------------
        this.dataStore = new Ext.i3.data.GroupJsonStore({
            root: "items",
            fields:[
                    {name: 'task_kbn',          mapping:'task_kbn'},
                    {name: 'task_cd',           mapping:'task_cd'},
                    {name: 'item_name',         mapping:'item_name'},
                    {name: 'user_name',         mapping:'user_name'},
                    {name: 'comp_exp_date',     mapping:'comp_exp_date'},
                    {name: 'situation',         mapping:'situation'},
                    {name: 'priority_kbn',      mapping:'priority_kbn'},
                    {name: 'progress_kbn',      mapping:'progress_kbn'},
                    {name: 'client_user_name',  mapping:'client_user_name'},
                    {name: 'id',                mapping:'id'},
                    {name: 'isgroup',           mapping:'isgroup'},
                    {name: 'level',             mapping:'level'},
                    {name: 'class_word1',       mapping:'class_word1'},
                    {name: 'class_word2',       mapping:'class_word2'},
                    {name: 'class_word3',       mapping:'class_word3'}
            ],
            groups : [
                    {name: 'class_word1',       mapping:'item_name'},
                    {name: 'class_word2',       mapping:'item_name'},
                    {name: 'class_word3',       mapping:'item_name'}
            ],
            copyfields : [
                    {name: 'id'}
            ]
        });

        //-----------------------------
        // カラムモデル生成
        //-----------------------------
        var colModel = new Ext.grid.ColumnModel([
            {header: "", width: 15, sortable: false, dataIndex: 'progress_kbn', renderer: this.onProgressKbnRenderer.createDelegate(this), align:"center"},
            {header: "", width: 50, sortable: false, dataIndex: 'task_cd', align:"center"},
            {header: app_localized_message("label", "task"), sortable: false, locked:false, dataIndex: 'item_name', id:'item_name', renderer: this.onItemNameRenderer.createDelegate(this)},
            {header: app_localized_message("label", "charge_user"), width: 120, sortable: false, dataIndex: 'user_name'},
            {header: app_localized_message("label", "complete_date"), width: 100, sortable: false, dataIndex: 'comp_exp_date', align:"center"},
            {header: app_localized_message("label", "situation"), width: 100, sortable: false, dataIndex: 'situation', align:"center"},
            {header: app_localized_message("label", "client_user"), width: 120, sortable: false, dataIndex: 'client_user_name'}
        ]);

        //-----------------------------
        // グリッド生成生成
        //-----------------------------
        this.view = new Ext.i3.grid.GroupGridView();
        this.view.getRowClassExtension = this.fncGetRowClass.createDelegate(this)
        this.elm_grid = new Ext.grid.GridPanel({
            //renderTo : this.tab_layout,
            ds : this.dataStore,
            cm : colModel,
            //sm : selModel,
            view : this.view,
            autoExpandColumn: 'item_name',
            loadMask : true,
            monitorResize : true,
            region: 'center',
            margins: '0 0 0 0',
            stripeRows : true
        });

	    //-----------------------------
        // グリッドパネル・レイアウト生成
	    //-----------------------------
	    /*
        var layout = Ext.BorderLayout.create({
            center: {
                margins:{left:0,top:0,right:0,bottom:0},
                panels: [new Ext.GridPanel(grid)]
            }
        }, this.container_panel);
        * */
        var opt = {
            applyTo : this.container_panel,
            layout  : 'border',
            monitorResize : true,
            border : false,
            items : [
                this.elm_grid
            ]
        }
        this.grid_layout = new Ext.Container(opt);

	    //-----------------------------
        // コンテキストメニュー生成
	    //-----------------------------
        this.ctxMenu = new Ext.menu.Menu({id: this.elm_grid.id + "-hctx"});
        this.ctxMenu.add(
            {id:"upitem", text: "上へ", cls: "grid-ctx-menu-up"},
            {id:"downitem", text: "下へ", cls: "grid-ctx-menu-down"}
        );
        this.ctxMenu.on("itemclick", this.onCtxMenuClick, this);

	    //-----------------------------
        // イベントリスナー定義
	    //-----------------------------
        this.elm_grid.addListener( "rowclick", this.onRowClick, this, null ) ;
        this.elm_grid.addListener( "rowdblclick", this.onRowDblClick, this, null ) ;
        this.elm_grid.addListener( "rowcontextmenu", this.onRowContextMenu, this, null ) ;

	    //-----------------------------
        // グリッド描画
	    //-----------------------------
        //grid.render();
    },
    
    /*
     * 関数名：fncResetWbsList
     * 概　要：WBSリストの再設定（内容再描画）
     * 引　数：wbslist      wbslist     WBSデータリスト
     * 戻り値：なし
     */
    fncResetWbsList : function (wbslist)
    {
        this.dataStore.loadData({items:wbslist});
    },

    /*
     * 関数名：fncGetAttribute
     * 概　要：このオブジェクトの属性を取得する
     * 引　数：attr_name     string             属性名文字列
     * 戻り値：属性値        mixed  
     */
    fncGetAttribute : function( attr_name ){
        switch( attr_name ){
            case 'selectedIndex' :
                return this.selectedIndex ;
            default :
                return false ;
                break ;
        }
    },

    /*
     * 関数名：fncGetRowAttribute
     * 概　要：指定された行の属性を取得する
     * 引　数：index         Number             行インデックス
     * 戻り値：attr_name     string             属性名文字列
     * 戻り値：属性値        mixed  
     */
    fncGetRowAttribute : function( index, attr_name ){
        var ds = this.dataStore ;
        var rec = ds.getAt( index ) ;
        if( rec == null )   return null ;
    
        switch( attr_name ){
            case 'id' :
            case 'class_word1' :
            case 'class_word2' :
            case 'class_word3' :
            case 'task_kbn' :
                eval("var ret = rec.data."+attr_name ) ;
                return ret ;
                break ;
            default :
                return false ;
                break ;
        }
    },

    /*
     * 関数名：fncExecCallbackFunc
     * 概　要：コールバック関数が指定されていれば、それを呼び出す
     * 引　数：callback_name    string    コールバック種類文字列
     * 戻り値：なし
     */
    fncExecCallbackFunc : function( callback_name ){
        if( this.callback == null )    return false ;
        if( this.callback[callback_name] == null )    return false ;
        
        // 指定されているコールバック関数の配列を取得
        var target_callback = this.callback[callback_name] ;
    
        // コールバック関数を順に実施
        if( target_callback != null && target_callback.length > 0 ){
            for( var findex=0 ; findex<target_callback.length ; findex++ ){
                var cb_func = target_callback[findex] ;
                cb_func.call() ;
            }
        }
    },

    fncGetRowClass : function( rec, rowIndex ){
        var task_kbn = parseInt(rec.get('task_kbn'));
        var cssclass = "" ;
        
        switch (task_kbn) {
            case 1 :
                cssclass += " i3_extension_row_task" ;
                var priority_kbn = parseInt(rec.get('priority_kbn'));
                if( priority_kbn == 1 ) cssclass += "_low" ;
                if( priority_kbn == 2 ) cssclass += "_normal" ;
                if( priority_kbn == 3 ) cssclass += "_high" ;
                var progress_kbn = parseInt(rec.get('progress_kbn'));
                if( progress_kbn == 3 ) cssclass += "_complete i3_extension_row_complete" ;
                break ;
            case 2 :
                cssclass += " i3_extension_row_milestone" ;
                break ;
            case 3 :
                cssclass += " i3_extension_row_event" ;
                break ;
            default :
                break ;
        }
        
        return cssclass ;
    },

    /*
     * 関数名：onRowClick
     * 概　要：グリッド行クリックイベントハンドラ
     * 引　数：grid             Ext.grid.Grid               グリッドオブジェクト
     *       ：rowIndex         Number                      クリック行インデックス
     *       ：grid             Ext.EventObject             イベントオブジェクト
     * 戻り値：なし
     */
    onRowClick : function(grid, rowIndex, e){
        this.selectedIndex = rowIndex ;

				//2008/07/15 add kawazoe 別のアイテムを選択してからでないとリストを開閉できない不具合の対応　start  
        var ds = this.dataStore;
        var r  = ds.getAt(rowIndex);
        var isgroup = r.data.isgroup;
        var level   = r.data.level;
        
        if (isgroup) {
            var style  = "display:block";
            var expand = true;
            if (r.data.expand == null || r.data.expand == true) {
                style = "display:none" ;
                expand = false ;
            }

            var nextindex = rowIndex + 1;
            var next      = ds.getAt(nextindex);
            while (next != null) {
                if (level >= next.data.level) break;
                
                var row = this.view.getRow(nextindex);
                Ext.DomHelper.applyStyles(row, style);
                
                nextindex++;
                next = ds.getAt(nextindex);
            }
            r.data.expand = expand;
            if (expand) {
                Ext.get(this.view.getRow(rowIndex)).removeClass("i3_extension_row_groups_expand_false");
                Ext.get(this.view.getRow(rowIndex)).addClass("i3_extension_row_groups_expand_true");
            } else {
                Ext.get(this.view.getRow(rowIndex)).removeClass("i3_extension_row_groups_expand_true");
                Ext.get(this.view.getRow(rowIndex)).addClass("i3_extension_row_groups_expand_false");
            }						
            this.view.layout();
        }				
				//2008/07/15 add kawazoe 別のアイテムを選択してからでないとリストを開閉できない不具合の対応　end

    },

    /*
     * 関数名：onRowDblClick
     * 概　要：グリッド行ダブルクリックイベントハンドラ
     * 引　数：grid             Ext.grid.Grid               グリッドオブジェクト
     *       ：rowIndex         Number                      ダブルクリック行インデックス
     *       ：grid             Ext.EventObject             イベントオブジェクト
     * 戻り値：なし
     */
    onRowDblClick : function(grid, rowIndex, e){
        this.selectedIndex = rowIndex ;
        this.fncExecCallbackFunc('on_dblclick') ;
    },

    /*
     * 関数名：onItemNameRenderer
     * 概　要：アイテム名レンダラー
     * 引　数：value            Mixed                       アイテム名データ
     *       ：phash            Hash　                      セル情報
     *       ：rec              Ext.data.Record             行データオブジェクト
     *       ：rowIndex         Number                      行インデックス
     *       ：cellIndex        Number                      列インデックス
     *       ：datastore        Ext.data.JsonStore          データストアオブジェクト
     * 戻り値：セル表示内容文字列
     */
    onItemNameRenderer : function(value, phash, rec, rowIndex, cellIndex, datastore){
        var alttext = "" ;
        if( rec.get('isgroup') ){
            alttext = app_localized_message("label", "wbs_icon_prefix_class") ;
        }
        else{
            switch (parseInt(rec.get('task_kbn'))) {
                case 1 :
                    var priority_kbn = parseInt(rec.get('priority_kbn'));
                    if( priority_kbn == 1 ){
                        alttext = app_localized_message("label", "wbs_icon_prefix_task_low") ;
                    }
                    else if( priority_kbn == 3 ){
                        alttext = app_localized_message("label", "wbs_icon_prefix_task_high") ;
                    }
                    else{
                        alttext = app_localized_message("label", "wbs_icon_prefix_task") ;
                    }
                    break ;
                case 2 :
                    alttext = app_localized_message("label", "wbs_icon_prefix_milestone") ;
                    break ;
                case 3 :
                    alttext = app_localized_message("label", "wbs_icon_prefix_event") ;
                    break ;
            }
        }
        var prefix = String.format('<img class="i3_extension_prefix_icon" src="{0}" width="13" height="13" alt="{1}">', url_for('/images/s.gif'), alttext ) ;
        return String.format('<span style="margin-left:{0}px;white-space:nowrap;overflow:hidden;">{1}&nbsp;{2}</span>', rec.get('level')*15, prefix, value ) ;
    },
    
    /*
     * 関数名：onProgressKbnRenderer
     * 概　要：進捗状況レンダラー
     * 引　数：value            Mixed                       アイテム名データ
     *       ：phash            Hash　                      セル情報
     *       ：rec              Ext.data.Record             行データオブジェクト
     *       ：rowIndex         Number                      行インデックス
     *       ：cellIndex        Number                      列インデックス
     *       ：datastore        Ext.data.JsonStore          データストアオブジェクト
     * 戻り値：セル表示内容文字列
     */
    onProgressKbnRenderer : function (value, phash, rec, rowIndex, cellIndex, datastore){
        if( rec.get('task_kbn')==1 && rec.get('progress_kbn')==3 ){
            var alttext = app_localized_message("label", "complete") ;
            return String.format('<img class="i3_extension_progress_icon" src="{0}" width="10" height="10" alt={1}>', url_for('/images/s.gif'), alttext ) ;
        }
        else{
            return '' ;
        }
    },
    
    onRowContextMenu : function(grid, rowIndex, e ){
        this.selectedIndex = rowIndex ;
        var rec = grid.store.getAt(rowIndex) ;
        if(rec.get('isgroup'))  return false ;
        
        e.stopEvent();
        var row = e.getTarget() ;
        var pos = e.getXY() ;
        this.ctxMenu.showAt(pos) ;
    },
    
    onCtxMenuClick : function(baseItem, e){
        switch (baseItem.id) {
            case 'upitem' :
                this.fncExecCallbackFunc('on_upitem');
                break ;
            case 'downitem' :
                this.fncExecCallbackFunc('on_downitem');
                break ;
        }
    }
}// endof prototype


App.ListWbsGrid = new ListWbsGrid();

}// endof if